package cn.kgc.javaweb.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author: mosin
 * @version: v1.0  2022/5/30
 * 非法请求处理的过滤器
 *
 * Filter 生命周期
 * 1.创建  tomcat 容器启动时
 * 2.执行   一次请求执行一次doFilter
 * 3.销毁   destroy  服务器正常关闭时  一次
 */
@WebFilter("/*")
public class LoginFilter implements Filter {

    public  LoginFilter(){
        //System.out.println("LoginFilter 对象被创建" );
    }

    //初始化方法  对象创建后 自动调用 只会调用一次
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println(" LoginFilter init()");
    }

    //拦截请求的具体处理方法  执行多次
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {


        //获取session中保存的user对象 通过user对象的获取情况 判定用户是否登录
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        Object user = req.getSession().getAttribute("user");

        //放行特定的页面  login.jsp  reg.jsp
        //获取请求路径
        String servletPath = req.getServletPath();
        System.out.println("servletPath = " + servletPath);
        if(servletPath.equals("/login.jsp")||servletPath.equals("/reg.jsp")){ //放行
            chain.doFilter(req, resp);
            return;
        }

        //放行特定请求  login  reg
        String method = req.getParameter("method");
        if("login".equals(method)||"reg".equals(method)){
            chain.doFilter(req, resp);
            return;
        }

        //放行静态资源
        if(servletPath.startsWith("/static")){
            chain.doFilter(req, resp);
            return;
        }


        if(user!=null){
            //放行请求
            chain.doFilter(req, resp);
        }else{  //将页面跳转至登录页
            resp.sendRedirect(req.getContextPath()+"/login.jsp");
        }

        //System.out.println("doFilter()");
    }

    //销毁时执行的方法
    @Override
    public void destroy() {
        //System.out.println("destroy()");
    }
}
